// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart.core;

/// 用于Mirror，Invocation和[Function.apply]的不透明的名称。
abstract class Symbol {
  /**
   * 构造一个新的Symbol符号。
   *
   * name必须是一个有效的Dart公有成员名称、
   * 公有构造函数名称、或库名，限定名可选。
   *
   * 限定名，是一个有效的名称，它的前面有一个公有标识符名称和'`.`'。
   * 例如，`foo.bar.baz=`是`baz=`的一个合格版本。
   * 这意味着，[name]字符串的内容必须是下面的情况之一：
   *
   * * 一个有效的公有Dart标识符
   *   （也就是说，标识符不能以"`_`"开头）
   * * 一个标识符跟着一个"="（setter名称）
   * * 一个可声明的操作符名称
   *   （如"`+`"，"`-`"，"`*`"，"`/`"，"`%`"，"`~/`"，"`&`"，"`|`"，
   *   "`^`"，"`~`"，"`<<`"，"`>>`"，"`<`"，"`<=`"，"`>`"，"`>=`"，"`==`"，
   *   "`[]`"，"`[]=`"，或"`unary-`"，其中之一）
   * * 在上面的情况下，前面加任何数量的合格名称（非私有标识符）和'`.`'
   * * 空字符串（当库未声明库名时，使用的默认名称）
   *
   * 下面并不是规范中要求的：
   *
   * 创建非const的Symbol实例，可能导致更大的输出。
   * 如果可能，使用"dart:mirrors"库中的[MirrorsUsed]，
   * 来指定可能通过此构造函数的名称。
   */
  const factory Symbol(String name) = internal.Symbol;

  /**
   * 返回一个与[operator==]兼容的哈希码。
   *
   * Symbol相等时，哈希码相同。
   */
  int get hashCode;

  /**
   * 当对应的成员名称相同时，Symbol相等。
   *
   * 合格的成员名称，像`#foo.bar`，
   * 仅在它们最后相同的成员名称前的标识符相同时，才会相等。
   */
  bool operator ==(other);
}
